// License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
// "Business Source License" is a trademark of MariaDB Corporation Ab.
//
// Parameters
//
// Licensor:             Union.fi, Labs Inc.
// Licensed Work:        All files under https://github.com/unionlabs/union's cosmwasm/lst subdirectory
//                       The Licensed Work is (c) 2025 Union.fi, Labs Inc.
// Change Date:          Four years from the date the Licensed Work is published.
// Change License:       Apache-2.0
//
//
// For information about alternative licensing arrangements for the Licensed Work,
// please contact info@union.build.
//
// Notice
//
// Business Source License 1.1
//
// Terms
//
// The Licensor hereby grants you the right to copy, modify, create derivative
// works, redistribute, and make non-production use of the Licensed Work. The
// Licensor may make an Additional Use Grant, above, permitting limited production use.
//
// Effective on the Change Date, or the fourth anniversary of the first publicly
// available distribution of a specific version of the Licensed Work under this
// License, whichever comes first, the Licensor hereby grants you rights under
// the terms of the Change License, and the rights granted in the paragraph
// above terminate.
//
// If your use of the Licensed Work does not comply with the requirements
// currently in effect as described in this License, you must purchase a
// commercial license from the Licensor, its affiliated entities, or authorized
// resellers, or you must refrain from using the Licensed Work.
//
// All copies of the original and modified Licensed Work, and derivative works
// of the Licensed Work, are subject to this License. This License applies
// separately for each version of the Licensed Work and the Change Date may vary
// for each version of the Licensed Work released by Licensor.
//
// You must conspicuously display this License on each original or modified copy
// of the Licensed Work. If you receive the Licensed Work in original or
// modified form from a third party, the terms and conditions set forth in this
// License apply to your use of that work.
//
// Any use of the Licensed Work in violation of this License will automatically
// terminate your rights under this License for the current and all other
// versions of the Licensed Work.
//
// This License does not grant you any right in any trademark or logo of
// Licensor or its affiliates (provided that you may use a trademark or logo of
// Licensor as expressly required by this License).
//
// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
// AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
// TITLE.

use cosmwasm_std::{
    Addr,
    testing::{message_info, mock_dependencies, mock_env},
};
use depolama::StorageExt;

use crate::{
    contract::{init, instantiate},
    error::ContractError,
    execute::FEE_RATE_DENOMINATOR,
    state::CurrentPendingBatch,
    tests::test_helper::{UNION1, mock_init_msg},
    types::{BatchId, PendingBatch},
};

#[test]
fn invalid_max_fee_rate_fails() {
    let mut deps = mock_dependencies();
    let mut msg = mock_init_msg();

    msg.protocol_fee_config.fee_rate = (FEE_RATE_DENOMINATOR as u128) + 1;

    assert_eq!(
        init(deps.as_mut(), mock_env(), msg).unwrap_err(),
        ContractError::InvalidProtocolFeeRate
    );
}

#[test]
fn invalid_batch_period_fails() {
    let mut deps = mock_dependencies();
    let mut msg = mock_init_msg();

    msg.batch_period_seconds = 101;
    msg.unbonding_period_seconds = 100;

    assert_eq!(
        init(deps.as_mut(), mock_env(), msg).unwrap_err(),
        ContractError::BatchPeriodLargerThanUnbondingPeriod {
            batch_period_seconds: 101,
            unbonding_period_seconds: 100,
        }
    );
}

// TODO: Assert more storages here
#[test]
fn init_properly() {
    let mut deps = mock_dependencies();

    init(deps.as_mut(), mock_env(), mock_init_msg().clone()).unwrap();

    assert_eq!(
        deps.storage.read_item::<CurrentPendingBatch>().unwrap(),
        PendingBatch::new(
            BatchId::ONE,
            mock_env().block.time.seconds() + mock_init_msg().batch_period_seconds
        ),
    );
}

#[test]
#[should_panic]
fn instantiate_not_allowed() {
    let _ = instantiate(
        mock_dependencies().as_mut(),
        mock_env(),
        message_info(&Addr::unchecked(UNION1), &[]),
        (),
    );
}
